#ifndef __gpio_H__
#define __gpio_H__
#ifdef __cplusplus
extern "C"
{
#endif
    /*
        Chinese is encoded in Unicode. If it is garbled, please change the encoding method of the editor.
        GPIO库 By启凡科创 适用于STC8平台MCU
        version:v1.0.0  2022-11-7
    */

#include "LIB_CONFIG.h"
#ifndef GPIO_EN
#define GPIO_EN 0 // 如果配置文件未定义，则用户自定义，0禁用模块不不编译，1启用模块
#endif

#if GPIO_EN
    typedef enum
    {
        OUTPUT_LOW_PULLUP, // 准双向输出模式
        OUTPUT_PUSH_PULL,  // 强推挽输出模式
        INPUT,             // 高阻输入模式
        OPEN_DRAIN,        // 开漏输出模式
        OUTPUT_PULLUP,     // 4K上拉输出模式
        INPUT_PULLUP,      // 4K上拉输入模式
    } gpio_type;

    enum
    {
        LOW = 0,
        HIGH
    };

    typedef enum
    {
        GPIO_P0,
        GPIO_P1,
        GPIO_P2,
        GPIO_P3,
        GPIO_P4,
        GPIO_P5,
        GPIO_P6,
        GPIO_P7
    } GPIO_TYPE;

    typedef enum
    {
        GPIO_NUM_0 = 0X01,
        GPIO_NUM_1 = 0X02,
        GPIO_NUM_2 = 0X04,
        GPIO_NUM_3 = 0X08,
        GPIO_NUM_4 = 0X10,
        GPIO_NUM_5 = 0X20,
        GPIO_NUM_6 = 0X40,
        GPIO_NUM_7 = 0X80
    } GPIO_NUM;

    /**
     * @brief 设置某个引脚的模式
     *
     * @param pin 管脚号，如P2.5为25，P0.7为07
     * @param --
     * @param mode 设置模式：
     * @param ··OUTPUT_LOW_PULLUP 准双向弱上拉输出模式
     * @param ··OUTPUT_PUSH_PULL 强推挽输出模式
     * @param ··INPUT 高阻输入模式
     * @param ··OPEN_DRAIN 开漏输出模式
     * @param ··OUTPUT_PULLUP 4K强上拉输出模式
     * @param ··INPUT_PULLUP 4K强上拉输入模式
     */
    void gpio_mode(uint8_t pin, gpio_type mode);

    /**
     * @brief 设置某个端口整组指定引脚的模式
     *
     * @param PIN_ALL
     * @param ··GPIO_P0
     * @param ··至
     * @param ··GPIO_P7
     * @param ··
     * @param flg_val 需要设置的端口的标志使能,如设置P1.0和P1.6为指定模式则val = 0x41 = 0100 0001;
     * @param ··
     * @param mode 设置模式：
     * @param ··OUTPUT_LOW_PULLUP 准双向弱上拉输出模式
     * @param ··OUTPUT_PUSH_PULL 强推挽输出模式
     * @param ··INPUT 高阻输入模式
     * @param ··OPEN_DRAIN 开漏输出模式
     * @param ··OUTPUT_PULLUP 4K强上拉输出模式
     * @param ··INPUT_PULLUP 4K强上拉输入模式
     *
     */
    void gpio_mode_all(GPIO_TYPE PIN_ALL, uint8_t flg_val, gpio_type mode);

    /**
     * @brief 设置指定IO口电平状态,适用场景：对端口翻转速度要求不高，高速场景请直接操作IO
     *
     * @param pin 管脚号，如P2.5为25，P0.7为07
     * @param level 电平:0,1
     *
     */
    void gpio_write(uint8_t pin, uint8_t level);

    /**
     * @brief 读取指定IO口电平状态,适用场景：对端口速度要求不高，高速场景请直接读IO寄存器
     *
     * @param pin 管脚号，如P2.5为25，P0.7为07
     * @return uint8_t 0/1
     */
    uint8_t gpio_read(uint8_t pin);

    /**
     * @brief 翻转指定IO口电平状态,适用场景：对端口速度要求不高，高速场景请直接操作IO寄存器
     *
     * @param pin pin:管脚号，如P2.5为25，P0.7为07
     */
    void gpio_toggle(uint8_t pin);

#endif
#ifdef __cplusplus
}
#endif
#endif
